簡體   English   中英

在Linq中將int轉換為字符串到實體的問題

[英]Problem with converting int to string in Linq to entities

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#的嚴格性!!!

在EF v4中,您可以使用SqlFunctions.StringConvert int沒有重載,因此您需要轉換為雙精度或十進制。 您的代碼最終看起來像這樣:

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-to-entities中執行查詢,然后再在linq-to-objects中處理字符串。 在此示例中,我想獲取一組包含聯系人全名和ContactLocationKey的數據,ContactLocationKey是兩個Integer列(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()將是正確的。

Brian Cauthon的答案非常好! 對於EF 6,只需稍作更新,該類便移至另一個名稱空間。 因此,在EF 6之前,您應該包括:

System.Data.Objects.SqlClient

如果您更新到EF 6,或者只是使用此版本,請包括:

System.Data.Entity.SqlServer

通過在EF6中包含不正確的名稱空間,代碼可以很好地編譯,但會引發運行時錯誤。 我希望此注釋有助於避免混淆。

如果您的“聯系人”充當通用列表,我希望以下代碼能正常工作。

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

謝謝。

當我將我的MVC 2應用程序轉換為MVC 3時遇到了同樣的問題,只是想為這個問題提供另一個(干凈的)解決方案,我想發布我所做的...

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

GetProducers()僅返回生產者的實體集合。 PS SqlFunctions.StringConvert對我不起作用。

使用MySql, SqlFunctions.StringConvert對我不起作用。 由於我在項目的20多個位置中使用了SelectListItem ,因此我希望找到一種能夠在不扭曲20多個LINQ語句的情況下工作的解決方案。 我的解決方案是為SelectedListItem子類提供一個整數設置器,該設置器將類型轉換從LINQ移開。 顯然,該解決方案很難一概而論,但對我的特定項目很有幫助。

若要使用,請創建以下類型,並在LINQ查詢中使用它代替SelectedListItem並使用IntValue代替Value。

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

如果您使用實體框架,並且想要使唯一的int可以接受,那么您可以在linq查詢中使用它,您可以嘗試一下

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

它會起作用,因為使用(int)會將您的值轉換為int,因此您不需要將字符串轉換為int即可獲得所需的結果。

這在我的項目中為我工作,我認為這對您有幫助

另一種解決方案:

c.ContactId + ""

只需添加空字符串,它將被轉換為字符串。

我的理解是,您必須創建一個局部類以“擴展”模型並添加一個只讀屬性,該屬性可以利用該類的其余屬性。

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 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM