1

IDのリストがあるとします。

string str = "82174F2000000, 82174F2000001, 82174F2000002, 82174F2000003, 82174F2000004, 82174F2000005";

そして、あなたはこれを行います:

var tids = new List<string>(str.Replace(", ", ",").Split(','));
var tntable = tids.AsQueryable();

そして、それを左結合のテーブルと比較したいとします。

var line = from c in db.Ctable
 join l  in tntable on c.CarID equals l.CarID into c_j
  from l in c_j.DefaultIfEmpty()
  select new
  {
 Name =  c.OwnerName,
 Hours = c.Hours
  };

tntableには「CarID」というフィールドがないようです。

誰か助けてもらえますか?

これは、LINQtoEntity用です。

私はこれを見ました:

LINQを使用してList<String>をDBテーブルと比較する方法

しかし、LEFTJOINを行うことを知らない。

TIA!

私はこれが長いことを知っています。しかし、読んでくれてありがとう。

MichaC用に更新:

CTableのデータベースには、次のCarIDがあります。

CarID
_____
82174F2000000
82174F2000001
82174F2000002
82174F2000003

テーブル(tntable)に、レコードに分割された文字列が含まれているとしましょう。

CarID
_____
82174F2000000
82174F2000001
82174F2000002
82174F2000003
82174F2000004
82174F2000005

したがって、このような左結合:

SELECT C.CarID, T.CarID
FROM CTable C
LEFT JOIN tntable T ON C.CarID = T.CarID

あなたにこれをもたらすでしょう:

T.CarID         C.CarID
_______         _______
82174F2000000   82174F2000000
82174F2000001   82174F2000001
82174F2000002   82174F2000002
82174F2000003   82174F2000003
82174F2000004   NULL
82174F2000005   NULL 
4

3 に答える 3

1

私があなたの質問を正しく読んでいる場合、左結合を実行するのではなく、IDのリストに基づいてフィルタリングしたいようです。私はあなたがこのようなものが欲しいと思います:

var line = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              Name =  c.OwnerName,
              Hours = c.Hours
           };

更新:Containsチェックをselectステートメントに移動して、すべてを返すことができます。

var line = from c in db.Ctable
           select new 
           {
              IsMatch = tntable.Contains(c.CarID),
              Name =  c.OwnerName,
              Hours = c.Hours
           };

更新2:わかりました。これはどうですか。オリジナルを使用してSQLから関連するアイテムをプルし、Linq to Objectsを使用して、実際に希望どおりにリストを作成します。.ToList()は、SQLクエリを実行するように強制します。.AsEnumerable()を使用することもできます。

var filtered = from c in db.Ctable
           where tntable.Contains(c.CarID)
           select new 
           {
              CarID = c.CarID,
              Name =  c.OwnerName,
              Hours = c.Hours
           };

var line = from x in tntable
           join i in filtered.ToList() on x equals u.CarID into i_match
           from i in i_match.DefaultIfEmpty()
           select { x, i };
于 2012-07-10T00:42:29.490 に答える
0

これを見てください:

string str = "Pat, Boots";
var names = new List<string>(str.Replace(", ", ",").Split(',')).AsQueryable();

Pet defaultPet = new Pet { Name = "Default Pet", Age = -1 };

List<Pet> pets1 = new List<Pet>{ 
            new Pet { Name="Barley", Age=8 },
            new Pet { Name="Boots", Age=4 },
            new Pet { Name="Whiskers", Age=1 } 
    };

var pets = from name in names
            join pet in pets1 on name equals pet.Name into gj
            from subpet in gj.DefaultIfEmpty(defaultPet)
            select new { Name = name, Age = subpet.Age };


foreach(var newPet in pets) {
    Console.WriteLine("\nName: {0}, Age: {1} ", newPet.Name, newPet.Age );
}

これにより、次のものが生成されます。

Name: Pat, Age: -1
Name: Boots, Age: 4

これで目的の方法が実行されない場合は、MSDNの「方法:左外部結合を実行する(C#プログラミングガイド)」を詳しく調べてください。

DefaultIfEmpty()については、上記のリンクとMSDNのヘルプページを使用しました。

于 2012-07-10T08:45:04.813 に答える
0

コメントから、IDが?tntableに見つからない場合でも、nullですべてのIDのオブジェクトを選択する必要があります。ctable私がそれを正しく理解していれば、これはあなたに望ましい効果を与えると信じています。

var desired = from l in tntable
              join c in ctable on l equals c.CarID into lj
              from c in lj.DefaultIfEmpty()
              select
                  new
                      {
                          Name = c == null ? null : c.OwnerName,
                          Hours = c == null ? (int?)null : c.Hours
                      };
于 2012-07-10T01:26:38.807 に答える