سؤال

var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId, //Cannot implicitly convert type 'int' (ContactId) to 'string' (Value).
                Text = c.Name
            };
var items = from c in contacts
            select new ListItem
            {
                Value = c.ContactId.ToString(), //Throws exception: ToString is not supported in linq to entities.
                Text = c.Name
            };

هناك على أية حال أنا يمكن تحقيق هذا ؟ ملاحظة هذا في VB.NET لا توجد مشكلة في استخدام أول مقتطف يعمل فقط رائعة, VB مرنة ، أنا غير قادر على الحصول على استخدام C#'s التشدد!!!

هل كانت مفيدة؟

المحلول

ومع V4 EF يمكنك استخدام SqlFunctions.StringConvert . ليس هناك الزائد لكثافة لذا عليك أن يلقي إلى ضعفين أو عشري. التعليمات البرمجية ينتهي أبحث عن مثل هذا:

var items = from c in contacts
            select new ListItem
            {
                Value = SqlFunctions.StringConvert((double)c.ContactId).Trim(),
                Text = c.Name
            };

نصائح أخرى

وأنا تحل مشكلة مماثلة عن طريق وضع تحويل عدد صحيح إلى سلسلة من الاستعلام. ويمكن تحقيق ذلك عن طريق وضع الاستعلام إلى كائن.

var items = from c in contacts
            select new 
            {
                Value = c.ContactId,
                Text = c.Name
            };
var itemList = new SelectList();
foreach (var item in items)
{
    itemList.Add(new SelectListItem{ Value = item.ContactId, Text = item.Name });
}

استخدام LinqToObject :جهات الاتصال.AsEnumerable()

var items = from c in contacts.AsEnumerable()
            select new ListItem
            {
                Value = c.ContactId.ToString(),
                Text = c.Name
            };

وSqlFunctions.StringConvert ستعمل، ولكن أجد أنه مرهقة، وأكثر من مرة، وأنا لم يكن لديك حاجة حقيقية لإجراء تحويل سلسلة على الجانب SQL.

وماذا أفعل إذا كنت تريد أن تفعل التلاعب سلسلة من تنفيذ الاستعلام في وLINQ إلى كيانات أولا، ثم معالجة لسعات في وLINQ إلى الكائنات. في هذا المثال، أريد الحصول على مجموعة من البيانات التي تحتوي على FULLNAME والاتصال، ووContactLocationKey، وهو concatination سلسلة من عمودين صحيح (ContactID وLocationID).

// perform the linq-to-entities query, query execution is triggered by ToArray()
var data =
   (from c in Context.Contacts
   select new {
       c.ContactID,
       c.FullName,
       c.LocationID
   }).ToArray();

// at this point, the database has been called and we are working in
// linq-to-objects where ToString() is supported
// Key2 is an extra example that wouldn't work in linq-to-entities
var data2 =
   (from c in data
    select new {
       c.FullName,
       ContactLocationKey = c.ContactID.ToString() + "." + c.LocationID.ToString(),
       Key2 = string.Join(".", c.ContactID.ToString(), c.LocationID.ToString())
    }).ToArray();

والآن، أمنح أنها لا تحصل على مرهقة لدينا لإرسال اثنين من يختار من مجهول، ولكن أود أن أقول أن هو تفوق راحة التي يمكن أن تؤدي وظائف سلسلة (وغيرها) غير معتمدة في L2E. كما نضع في اعتبارنا أن هناك ربما ركلة جزاء الأداء باستخدام هذا الأسلوب.

public static IEnumerable<SelectListItem> GetCustomerList()
        {
            using (SiteDataContext db = new SiteDataContext())
            {
                var list = from l in db.Customers.AsEnumerable()
                           orderby l.CompanyName
                           select new SelectListItem { Value = l.CustomerID.ToString(), Text = l.CompanyName };

                return list.ToList();
            }
        }
var selectList = db.NewsClasses.ToList<NewsClass>().Select(a => new SelectListItem({
    Text = a.ClassName,
    Value = a.ClassId.ToString()
});

أولا، لتحويل الاعتراض، ثم toString () سوف تكون صحيحة.

الجواب

وبراين Cauthon هي ممتازة! مجرد تحديث الصغير، EF 6، والطبقة حصلت انتقلت إلى مساحة اسم آخر. لذا، وقبل EF 6، يجب أن تشمل:

System.Data.Objects.SqlClient

إذا قمت بتحديث إلى EF 6، أو ببساطة تستخدم هذا الإصدار، ما يلي:

System.Data.Entity.SqlServer

وقبل بما في ذلك مساحة الاسم غير صحيح مع EF6، ورمز تجميع ما يرام ولكن سوف رمي خطأ وقت التشغيل. آمل أن يكون هذا المذكرة يساعد على تجنب بعض الارتباك.

وأنا واجهت نفس المشكلة عندما كنت تحويل بلدي التطبيق MVC 2 إلى 3 MVC وفقط لإعطاء حل آخر (نظيف) لهذه المشكلة أريد أن الرد على ما فعلت ...

IEnumerable<SelectListItem> producers = new SelectList(Services.GetProducers(),
    "ID", "Name", model.ProducerID);

وGetProducers () ببساطة بإرجاع جمع كيان للمنتجين. ملاحظة. وقال إن SqlFunctions.StringConvert لا تعمل بالنسبة لي.

وإذا كان لديك "الاتصال" يتصرف كما القائمة العامة، وآمل أن التعليمة البرمجية التالية يعمل بشكل جيد.

var items = contact.Distinct().OrderBy(c => c.Name)
                              .Select( c => new ListItem
                              {
                                Value = c.ContactId.ToString(),
                                Text = c.Name
                              });

وشكرا.

وعن طريق الخلية، فإن SqlFunctions.StringConvert لا تعمل بالنسبة لي. منذ أن استخدام SelectListItem في 20+ الأماكن في مشروعي، وأنا يريد حلا التي تعمل دون اللوي و20+ البيانات LINQ. كان لي حل لSelectedListItem الطبقة الفرعية من أجل توفير اضع صحيحا، والتي تتحرك نوع التحويل بعيدا عن LINQ. ومن الواضح أن هذا الحل هو الصعب التعميم، ولكن مفيدة جدا لمشروعي محددة.

لاستخدام، وخلق نوع التالي واستخدامها في استعلام LINQ الخاصة بك في مكان SelectedListItem واستخدام IntValue بدلا من القيمة.

public class BtoSelectedListItem : SelectListItem
{
    public int IntValue
    {
        get { return string.IsNullOrEmpty(Value) ? 0 : int.Parse(Value); }
        set { Value = value.ToString(); }
    }
}

وحل واحد أكثر من ذلك:

c.ContactId + ""

وأضيف سلسلة فارغة وسيتم تحويلها إلى سلسلة.

وإذا كنت تستخدم إطار كيان وتريد أن تجعل فقط كثافة مقبولة ثم يمكنك استخدام هذا في استعلام LINQ يمكنك أن تجرب هذا

var items = from c in contacts
        select new ListItem
        {
            Value = (int)ContractId 
            Text = c.Name
        };

وأنها ستعمل بسبب استخدام (الباحث) سوف يلقي قيمة لكثافة العمليات بحيث لا تحتاج أي تحويل للسلسلة إلى int وتحصل على النتيجة التي تريدها.

وهذا العمل بالنسبة لي في مشروعي وأعتقد أنه سيكون من المفيد بالنسبة لك

وما أفهمه هو أن لديك لإنشاء فئة جزئية إلى "تمديد" النموذج الخاص بك وإضافة الممتلكات التي هي للقراءة فقط التي يمكن الاستفادة من بقية خصائص الفئة التي.

public partial class Contact{

   public string ContactIdString
   {
      get{ 
            return this.ContactId.ToString();
      }
   } 
}

ثم

var items = from c in contacts
select new ListItem
{
    Value = c.ContactIdString, 
    Text = c.Name
};
var items = from c in contacts
select new ListItem
{
    Value = String.Concat(c.ContactId), //This Works in Linq to Entity!
    Text = c.Name
};

ولقد وجدت أن SqlFunctions.StringConvert((double)c.Age) لم تنجح بالنسبة لي سواء كان الحقل من نوع Nullable<Int32>

واستغرق مني الكثير من البحث على مدى الأيام القليلة الماضية من التجربة والخطأ للعثور على هذا.

وآمل أن يساعد هذا بعض المبرمجون هناك.

هل حاولت:

var items = from c in contacts
        select new ListItem
        {
            Value = Convert.ToString(c.ContactId), 
            Text = c.Name
        };
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top