PDA

View Full Version : سوال: برطرف خطای Collation در LINQ



sanay_esh
دوشنبه 08 اسفند 1390, 19:18 عصر
با سلام

جدول A را با Collation Arabic_CI_AS دارم و جدول B را با Collation SQL_Latin1_General_CP1256_CI_AS دارم
مشکل اینجاست که وقتی LINQ بین این دو جدول بر اساس کلید ارتباطی زده میشود

from a in DataContext.A
join a in DataContext.B on a.af equals b.bf
select new { a,b.bf }



این خطا نمایش داده میشود

Cannot resolve the collation conflict between "Arabic_CI_AS" and "SQL_Latin1_General_CP1256_CI_AS" in the equal to operation.
چگونه میشه این مشکل رو حل کرد ؟
در خود SQL بعد از فیلد اول دستور COLLATE Arabic_CI_AS می آید و این مشکل را حل میکند

این دستور را در LINQ چگونه میشه پیاده کرد ؟

hf1988
سه شنبه 09 اسفند 1390, 08:27 صبح
سلام دوست عزیز .به نظرم تنها راهی که دارین اینه که هر یک از جداول رو تک تک بخونید بعد به صورت linq to object و به صورت زیر join کنید.




var lst1 = from s in datacontext.Table1 select s;
var lst2 = from s in datacontext.Table2 select s;

var joinResult = from m in lst1
join n in lst2 on m.RefrenceField equals n.ForeignkeyField
select new { m, n };

sanay_esh
سه شنبه 09 اسفند 1390, 08:34 صبح
سلام و تشکر
دوست عزیز اصل قضیه اینجاست که بنده بین 3 جدول بصورت زیر باید LINQ داشته باشیم

(from n in Factors_Sub
from m in Factors
from a in AID_AUTO
where m.FactorTypeID == 3 && n.FactorID == m.FactorID && n.AutoCode == ( a.AUTOCODE) group n by new { n.PackageID, n.FactorID , n.AutoCode } into g
select new { PID = g.Key.PackageID,AutoCode = g.Key.AutoCode , SumTax = g.Sum(x=>x.Tax) , SumToll = g.Sum(x=>x.Toll) , SumDiscount = g.Sum(x=>x.Discount) ,
SumTotal = g.Sum(x=>x.Total) } )


خطا هم موقعی رخ میدهد که AUTOCODE == AutoCode را بررسی میکنیم!!!

hf1988
سه شنبه 09 اسفند 1390, 08:50 صبح
الان تو این مثال collatione کدوم جداول با هم فرق داره؟
اونی که فرق داررو اول select کنید بعد با 2 تای دیگه join کنید .

sanay_esh
سه شنبه 09 اسفند 1390, 09:14 صبح
خوب کمی دقت میکردی خودت میتونستی متوجه بشی که جداول کدام ها هستند
جدول Factors_Sub , AID_AUTO

mehdi.mousavi
سه شنبه 09 اسفند 1390, 09:50 صبح
چگونه میشه این مشکل رو حل کرد ؟ در خود SQL بعد از فیلد اول دستور COLLATE Arabic_CI_AS می آید و این مشکل را حل میکند این دستور را در LINQ چگونه میشه پیاده کرد ؟

سلام.
شما دو راه حل (صحیح) پیش رو دارید که البته هیچ کدوم به LINQ ارتباطی نداره:


View ای متشکل از کلیه فیلدهای مورد نظر از سه جدول ایجاد کنید و اونجا Collation رو Handle کنید. (روش رو در پاسخ به سوال مشابه در این آدرس (http://stackoverflow.com/questions/2225904/collation-conflict) ببینید).
یک بار در بانک و با استفاده از ALTER COLUMN، مقدار Collation رو تغییر بدید تا کلیه فیلدها از یک Collation خاص استفاده کنند. (روش انجام اینکار رو اینجا ببینید (http://blog.sqlauthority.com/2008/12/20/sql-server-change-collation-of-database-column-t-sql-script/)).

بعد از انجام یکی از این دو کار، اونوقت می تونید LINQ مورد نظر رو بنویسید.

موفق باشید.

sanay_esh
سه شنبه 09 اسفند 1390, 10:30 صبح
جناب موسوی خیلی ممنون
بنده این مشکل را با راه حل پیشنهادی شما انجام داده بودم و مرحله را به پایان رساندم
خواستم بدونم که آیا در LINQ این امکان وجود دارد که دستورات خود SQL را در آن اجرا نمود حتی مانند Convert ها که فکر میکنم لینک خودش پشتیبانی نمیکنه ؟؟؟

mehdi.mousavi
سه شنبه 09 اسفند 1390, 10:55 صبح
خواستم بدونم که آیا در LINQ این امکان وجود دارد که دستورات خود SQL را در آن اجرا نمود؟؟؟

بله، شما می تونید از متود ExecuteQuery (http://msdn.microsoft.com/en-us/library/bb399403.aspx) برای اجرای مستقیم دستورات SQL استفاده کنید.

موفق باشید.