0

私は以下のようなデータセット関数を持っています、

    public DataSet GetUpodBrandList(string criteria, string locationId)
    {
        using (SqlConnection conn = new SqlConnection(this.ConnectionString))
        {
            string query;
            if (criteria == "")
                query = "select distinct brandDesc " +
                        "from arabia_upod_item_master " +
                        "where locationId = '" + locationId + 
                        "' order by brandDesc";
            else
                query = "select distinct brandDesc " +
                        "from arabia_upod_item_master " +
                        "where brandDesc like '%" + criteria + "%' " +
                        "and locationId = '" + locationId + "' 
                        order by brandDesc";
            conn.Open();
            SqlCommand command = new SqlCommand(query, conn);
            return this.ExecuteDatasetStoredProc(command);
        }
    }

次のようにlinqに変換しようとしています。

    public static List<DataContext.arabia_upod_item_master> GetUpodBrandList(
                                                               string criteria,
                                                               string locationId)
    {
        List<DataContext.arabia_upod_item_master> m = 
            new List<DataContext.arabia_upod_item_master>();
        using (var db = UpodDatabaseHelper.GetUpodDataContext())
        {
            db.ObjectTrackingEnabled = false;
            if (criteria == "")
                m = db.arabia_upod_item_masters.Where(
                          i => i.locationId == Convert.ToInt32(locationId))
                    .OrderBy(i => i.brandDesc)
                    .Distinct()
                    .ToList();
            else
                m = db.arabia_upod_item_masters.Where(
                        i => i.brandDesc.Contains(criteria) && 
                        i.locationId == Convert.ToInt32(locationId))
                    .OrderBy(i => i.brandDesc)
                    .Distinct()
                    .ToList();
            return m;
        }
    }

しかし、上記の関数で(前の関数のように)個別のbrandDescを選択する方法がわかりません。私は単にDistinct()を使用しています。正しいですか?またはそれを達成する他の方法はありますか?また、古い関数(つまり上記の最初の関数)のクエリに「case」があった場合、2番目の関数でそれをlinqに変換するにはどうすればよいですか?linqに変換する際に心配する他のことはありますか?

4

1 に答える 1

0

各呼び出しの.Select(i => i.brandDesc)直前に置きます。また、タイプDistinctを変更する必要がありList<x>ます。xbrandDesc

メソッド全体をリファクタリングする場合は、次のようにします。両方の形式のクエリに共通するコードを取り出し、他のいくつかの場所で微調整しました。

public static IList<string/* I assume*/>GetUpodBrandList(
    string criteria, string locationId)
 {
     // only do this once, not once per item.
     int locatId = Convert.ToInt32(locationId);

     using (var db = UpodDatabaseHelper.GetUpodDataContext())
     {
         db.ObjectTrackingEnabled = false;

         // This is a common start to both versions of the query.
         var query = db.arabia_upod_item_masters
             .Where(i => i.locationId == locatId);

         // This only applies to one version of the query.
         if (criteria != "")
         {
             query = query.Where(i => i.brandDesc.Contains(criteria));
         }

         // This is a common end to both version of the query.           
         return query
             .Select(i => i.brandDesc)
             .Distinct()
             // Do the ordering after the distinct as it will
             // presumably take less effort?
             .OrderBy(i => i.brandDesc)
             .ToList();
     }
 } 
于 2012-08-15T07:11:40.263 に答える