PDA

View Full Version : خطا در Entity Framework



Javad.Kashi
دوشنبه 13 تیر 1390, 22:37 عصر
سلام
من در EntityDataSource از CommandText استفاده کردم تا کوئری زیر اجرا بشه:

Select * from TableName


ولی خطای زیر را می دهد و .....


The query syntax is not valid. Near term '*', line 1, column 9.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.Data.EntitySqlException: The query syntax is not valid. Near term '*', line 1, column 9.

Source Error:

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.




لطفا یکی پاسخ سوال من را بدهد.

یا علی

reza344
چهارشنبه 26 مرداد 1390, 23:14 عصر
عدم پشتیبانی از * حتما می دانید که در زبان T-SQL هر گاه بخواهیم تمام ستونهای یک جدول را انتخاب کنیم از عبارت * استفاده می کردیم اما در Entity SQL این کار امکان پذیر نیست !

mehdi.mousavi
چهارشنبه 26 مرداد 1390, 23:52 عصر
سلام.
بطور کلی، استفاده از * در SELECT Clause هرگز ایده خوبی نبوده، چون علاوه بر برگردوندن داده هایی که به اونها (احتمالا) نیازی نیست، میتونه باعث Scan شدن Clustered Index ها (بدون در نظر گرفتن WHERE CLAUSE) بشه که خوب، تاثیر بسزایی میتونه در افت Performance در Query مورد نظر داشته باشه (توصیه می کنم حتما این مقاله (http://msdn.microsoft.com/en-us/library/ff647793.aspx) رو مطالعه کنید).

اما در مورد EF و سوالی که پرسیده اید. همونطوری که reza344 گفتن، شما نمی تونید از * در SELECT CLAUSE دستورات Entity SQL استفاده کنید. ضمنا، اگر فقط قراره فقط یک ستون رو برگردونید، باید از کلمه کلیدی VALUE استفاده کنید:


string qs = "SELECT VALUE it FROM SampleEntities.Contacts AS it";
using (SampleEntities context = new SampleEntities())
{
ObjectQuery<Contact> contacts = context.CreateQuery<Contact>(qs);
}

اما اگر قرار باشه چند ستون رو انتخاب کنید، دیگه نمی تونید تو Projection List دستور SQL خودتون، از VALUE استفاده کنید:

string qs = "SELECT it.FirstName, it.LastName FROM SampleEntities.Contacts AS it";
using (SampleEntities context = new SampleEntities())
{
ObjectQuery<DbDataRecord> records = context.CreateQuery<DbDataRecord>(qs);
foreach (DbDataRecord record in records)
{
string firstName = (string)record["FirstName"];
}
}


همونطوری که می بینید، چون فقط دو ستون انتخاب شده، دیگه نمیتونم مانند مثال اول نتیجه رو به Contact کست کنم، پس از DbDataRecord استفاده می کنم تا بتونم Result Set مورد نظرم رو بخونم.

موفق باشید.