8

これに関連するすべての例を見ましたが、問題を解決できませんでした。

asp .net mvc3 でドロップダウンリストを作成しています。

私は返すリポジトリを持っています:

    public IEnumerable<SelectListItem> GetPropertyTypeSelectList()
    {
        var propertyTypes = from p in db.PropertyType
                                orderby p.PropertyTypeDescription
                                select new SelectListItem
                                {
                                    Text = p.PropertyTypeDescription,
                                    Value = p.PropertyTypeId.ToString()
                                };
        return propertyTypes;
    }

私のビューモデルは次のようになります。

public class AddPropertyViewModel
{
    public Property Property { get; set; }
    public IEnumerable<SelectListItem> PropertyTypes { get; set; }
    public IEnumerable<SelectListItem> FurnishedTypes { get; set; }
}

HttpGet の「作成」アクションのコントローラーは次のようになります。

    public ActionResult AddProperty()
    {
        AddPropertyViewModel viewModel = new AddPropertyViewModel
        {
            PropertyTypes = websiterepository.GetPropertyTypeSelectList()

        };
        return View(viewModel);
    }

ビューは次のようになります。

    <div class="editor-label">
        @Html.LabelFor(model => model.Property.PropertyType)
        @Html.DropDownListFor(model => model.Property.PropertyType, Model.PropertyTypes)
    </div>

上記のエラーが発生しています。私が読んだことから、ToString() が問題を引き起こしているようです。しかし、それを修正する方法がわかりません。

ありがとう。

4

1 に答える 1

21

.ToString()LINQ to SQL は、呼び出しを SQL 式に変換する方法を認識していません。

したがって、次のように置き換えます。

var propertyTypes = 
    from p in db.PropertyType
    orderby p.PropertyTypeDescription
    select new SelectListItem
    {
        Text = p.PropertyTypeDescription,
        Value = p.PropertyTypeId.ToString()
    };

と:

var propertyTypes = db
    .PropertyType
    .OrderBy(x => x.PropertyTypeDescription)
    .ToList()
    .Select(x => new SelectListItem
    {
        Text = p.PropertyTypeDescription,
        Value = p.PropertyTypeId.ToString()
    });

.ToList()まで式を構築した後、積極的に SQL クエリを実行し、式が完全にサポートされているクライアント (LINQ to Entities ではなく LINQ to Objects) で実行する呼び出しに注意してください。OrderBy.ToString().ToString()

したがって、ここでは基本的に OrderBy 句 (含む) までの SQL クエリを作成し、.ToList を呼び出してこのクエリを積極的に実行し、クライアントで結果セットをフェッチします。次に、.Select ステートメントで連鎖を続けます。しかし、LINQ to Entities や SQL などはもう行っていません。すべての結果セットがメモリ内にあるため、LINQ to Objects を実行しています。また、LINQ to Objects で .ToString を実行しても問題はありません。

もう 1 つの可能性は、SqlFunctions.StringConvertそれを SQL に変換する方法を知っている組み込み関数を使用することです。このようにして、怠惰に保ちます。

var propertyTypes = 
    from p in db.PropertyType
    orderby p.PropertyTypeDescription
    select new SelectListItem
    {
        Text = p.PropertyTypeDescription,
        Value = SqlFunctions.StringConvert((double)p.PropertyTypeId)
    };
于 2012-08-20T21:11:21.663 に答える