Уключыце зменную ў якасці імя поля ў Linq заяву

Прывітанне У мяне ёсць спасылка заяву супраць табліцы базы дадзеных я не ствараў ... Структура дадзеных

  • Tbl_BankHols
  • BHDate .... Datetime
  • E ......... Bit
  • S ......... Bit
  • <�Літый> W ......... Біт
  • Я ......... Bit

У асноўным гэта мае спіс дат, а затым значэнне 0 або 1 у E, S, W, I, якія паказваюць, калі гэтая дата з'яўляецца свята банк у Англіі, Шатландыі, Уэльса і/або Ірландыі.

Калі я хачу, каб высветліць, калі дата свята банка ў любым з краін, мая заява Linq з'яўляецца

Dim BHQ = From d in db.Tbl_BankHols _
          Where d.BHDate = chkDate _
          Select d.BHDate

Дзе chkDate дата я правяраю. Калі вынік вяртаецца, то дата свята банка ў адной з краін.

Зараз трэба высветліць, калі chkDate свята банк у той ці іншай краіне, як я ўяўляю, што ў дзе заяву?

Я прашу, калі гэта магчыма, перш чым я думаю аб змене структуры базы дадзеных. Я думаў толькі маючы адно поле краіны ў выглядзе радка, якая будзе ўтрымліваць значэння, такія як E, EW, EWS, EWSI, I і іншыя падобныя камбінацыі, а затым я проста выкарыстоўваць WHERE BCountry LIKE% X% (дзе X з'яўляецца краінай I » м цікавіць). Ці ёсць лепшы спосаб?

0
Як нататка боку, вам не патрэбны _ у канцы радка. Не толькі ў LINQ, але ў цэлым VB
дададзена аўтар Teejay, крыніца
Як нататка боку, вам не патрэбны _ у канцы радка. Не толькі ў LINQ, але ў цэлым VB
дададзена аўтар Teejay, крыніца
Джон ... Я павінен быў растлумачыць .. Краіна будзе пераменная ... Існуюць табліца карыстальніка, які мае поле UCountry, роўны Е, I, W, S залежыць ад таго, дзе яны размешчаны. Мне было цікава, у я мог бы перадаць гэта ў LINQ неяк. Я мяркую, што ёсць яшчэ адзін варыянт ... Ці ёсць абраны на UCountry і залежаць ад выпадку стварыць адпаведны LINQ, як вы паказалі ...
дададзена аўтар Mych, крыніца
Джон ... Я павінен быў растлумачыць .. Краіна будзе пераменная ... Існуюць табліца карыстальніка, які мае поле UCountry, роўны Е, I, W, S залежыць ад таго, дзе яны размешчаны. Мне было цікава, у я мог бы перадаць гэта ў LINQ неяк. Я мяркую, што ёсць яшчэ адзін варыянт ... Ці ёсць абраны на UCountry і залежаць ад выпадку стварыць адпаведны LINQ, як вы паказалі ...
дададзена аўтар Mych, крыніца
Джон ... Я павінен быў растлумачыць .. Краіна будзе пераменная ... Існуюць табліца карыстальніка, які мае поле UCountry, роўны Е, I, W, S залежыць ад таго, дзе яны размешчаны. Мне было цікава, у я мог бы перадаць гэта ў LINQ неяк. Я мяркую, што ёсць яшчэ адзін варыянт ... Ці ёсць абраны на UCountry і залежаць ад выпадку стварыць адпаведны LINQ, як вы паказалі ...
дададзена аўтар Mych, крыніца
Калі вы збіраецеся змяніць структуру зрабіць гэта правільна, Ёсць адзін стол для countiries, то вы можаце мець табліцу дат з foriegn ключоў да краіны.
дададзена аўтар Jodrell, крыніца
Калі вы збіраецеся змяніць структуру зрабіць гэта правільна, Ёсць адзін стол для countiries, то вы можаце мець табліцу дат з foriegn ключоў да краіны.
дададзена аўтар Jodrell, крыніца
Спрабавалі Ці вы Дзе d.BHDate = chkDate І d.E = 1 ?
дададзена аўтар Jon, крыніца
Спрабавалі Ці вы Дзе d.BHDate = chkDate І d.E = 1 ?
дададзена аўтар Jon, крыніца
Спрабавалі Ці вы Дзе d.BHDate = chkDate І d.E = 1 ?
дададзена аўтар Jon, крыніца

7 адказы

Эмм прыпынак,

Ваша прапанова для дадатковай денормализация і выкарыстоўваючы LIKE сапраўды «няправільна» ідэя.

Вам патрэбен адзін стол для краін, дазваляе называць яго Краіна і іншы стол для адпачынку, дазваляе называць яго Holiday . <�Код> Краіна табліца павінна ўтрымліваць радок для кожнай краіны, у вашай сістэме/мадэлі. <�Код> Holiday табліца павінна мець дзве калонкі. Адзін для Дата і foriegn ключ да краіны, дазваляе называць яго CountryId .

Тады вашы LINQ можа выглядаць,

db.Holiday.Any(Function(h) h.Country.Name = 
                    "SomeCountry" AndAlso h.Date = someDate)

Прычыны, чаму вы shoudn't выкарыстоўваць LIKE для гэтага разнастайныя, але два асноўных пярэчанні.

LIKE doesn't perform well, its hard for an index to support it, and,

Уявім сабе сітуацыю, калі вам трэба захоўваць святы для гэтых краін,

<�Р> Эквадор </р>      <�Р> Сальвадор      <�Р> Эстонія      <�Р> Эфіопія </р>      <�Р> Англія

Цяпер вы ўжо прызначылі код «E» ў Англіі, які код вы дасце іншым? Няма праблем вы кажаце, "EL" , "ET" ... але ўжо ваш LIKE "% E" стан не парушаецца.


Вось скрыпты для схемы я б с.

CREATE TABLE [Country](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](100) NOT NULL,
    CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ));

CREATE TABLE [Holiday](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Date] [date] NOT NULL,
    [CountryId] [int] NOT NULL FOREIGN KEY Country(Id),
    CONSTRAINT [PK_Country] PRIMARY KEY CLUSTERED
    (
        [Id] ASC
    ));
1
дададзена
Jodrell, я дзякую вам за вашыя парады, і я буду ісці па гэтым шляху. У цяперашні час гэта дадатак прызначана для кліента Вялікабрытаніі толькі без якіх-небудзь патрабаванняў у дачыненні да міжнародных меркаванняў, прыведзеных у сферы кампетэнцыі. Але, як мы ўсе ведаем, што лепш думаць наперад у гэтай гульні.
дададзена аўтар Mych, крыніца
@Mych У такім выпадку я прапаную кнопку Імя слупок больш, чым неабходна. Гэта больш нармаваны падыход нават лепш, калі ў вас ёсць Краіна пералік, дзе значэнні супастаўляюцца з Country.Id , то вы хочаце would'nt слупок ідэнтыфікатараў, так як значэнні будзе выпраўлена. Для ўсіх, хто зацікаўлены, вось дзяржаўныя святы ў Вялікабрытаніі на працягу наступных некалькіх гадоў gov.uk/bank-holidays
дададзена аўтар Jodrell, крыніца

Замест таго, каб змяніць структуру вашай табліцы так, як вы напісалі, вы можаце ўвесці новую вобласць (, апісанне кода) табліцу і дадаць знешні ключ да вашага стала, паказваючы на ​​стол рэгіёнаў. Ваш стол у святочныя дні будзе ўтрымліваць адну запіс на (дата/вобласць) камбінацыі.

І ваша заяву LINQ:

Dim BHQ = From d in db.Tbl_BankHols _
      Where d.BHDate = chkDate And d.Region = "England" _
      Select d.BHDate
1
дададзена
Добра, як вы ўсё кажаце, мая структура змены не з'яўляецца добрай ідэяй, я прыслухаецца ваш савет .... Спускаючыся дзве табліцы з Fk структурай ... Вялікі дзякуй усім вам. Вы ўсё answere маё пытанне.
дададзена аўтар Mych, крыніца
Гэта будзе працаваць, але я гэта як вы кажаце, будзе ствараць, напрыклад, 4 запісы на Каляды адзін дзень для кожнага рэгіёну і на вяршыні, што ў мяне ёсць дадатковы стол. Калі ў мяне толькі ёсць адно поле з EWSI супраць Раства таго LIKE заява будзе забраць гэта без неабходнасці 3 дадатковых запісаў і іншай табліцы ... Дзякуй за прапанову, хоць.
дададзена аўтар Mych, крыніца
Зрабіць гэта лепш (прасцей) не горш.
дададзена аўтар Jodrell, крыніца

Замест таго, каб змяніць структуру вашай табліцы так, як вы напісалі, вы можаце ўвесці новую вобласць (, апісанне кода) табліцу і дадаць знешні ключ да вашага стала, паказваючы на ​​стол рэгіёнаў. Ваш стол у святочныя дні будзе ўтрымліваць адну запіс на (дата/вобласць) камбінацыі.

І ваша заяву LINQ:

Dim BHQ = From d in db.Tbl_BankHols _
      Where d.BHDate = chkDate And d.Region = "England" _
      Select d.BHDate
1
дададзена
Добра, як вы ўсё кажаце, мая структура змены не з'яўляецца добрай ідэяй, я прыслухаецца ваш савет .... Спускаючыся дзве табліцы з Fk структурай ... Вялікі дзякуй усім вам. Вы ўсё answere маё пытанне.
дададзена аўтар Mych, крыніца
Гэта будзе працаваць, але я гэта як вы кажаце, будзе ствараць, напрыклад, 4 запісы на Каляды адзін дзень для кожнага рэгіёну і на вяршыні, што ў мяне ёсць дадатковы стол. Калі ў мяне толькі ёсць адно поле з EWSI супраць Раства таго LIKE заява будзе забраць гэта без неабходнасці 3 дадатковых запісаў і іншай табліцы ... Дзякуй за прапанову, хоць.
дададзена аўтар Mych, крыніца
Зрабіць гэта лепш (прасцей) не горш.
дададзена аўтар Jodrell, крыніца

Замест таго, каб змяніць структуру вашай табліцы так, як вы напісалі, вы можаце ўвесці новую вобласць (, апісанне кода) табліцу і дадаць знешні ключ да вашага стала, паказваючы на ​​стол рэгіёнаў. Ваш стол у святочныя дні будзе ўтрымліваць адну запіс на (дата/вобласць) камбінацыі.

І ваша заяву LINQ:

Dim BHQ = From d in db.Tbl_BankHols _
      Where d.BHDate = chkDate And d.Region = "England" _
      Select d.BHDate
1
дададзена
Добра, як вы ўсё кажаце, мая структура змены не з'яўляецца добрай ідэяй, я прыслухаецца ваш савет .... Спускаючыся дзве табліцы з Fk структурай ... Вялікі дзякуй усім вам. Вы ўсё answere маё пытанне.
дададзена аўтар Mych, крыніца
Гэта будзе працаваць, але я гэта як вы кажаце, будзе ствараць, напрыклад, 4 запісы на Каляды адзін дзень для кожнага рэгіёну і на вяршыні, што ў мяне ёсць дадатковы стол. Калі ў мяне толькі ёсць адно поле з EWSI супраць Раства таго LIKE заява будзе забраць гэта без неабходнасці 3 дадатковых запісаў і іншай табліцы ... Дзякуй за прапанову, хоць.
дададзена аўтар Mych, крыніца
Зрабіць гэта лепш (прасцей) не горш.
дададзена аўтар Jodrell, крыніца
<�Р>, перш чым я думаю аб змене структуры базы дадзеных

Вы можаце зрабіць гэта шляхам складання запыту з кодам <> або прэдыкаты з дапамогай LINQKit </а>.

Dim IQueryable BHQ = ... (your query)

Dim pred = Predicate.False(Of BankHolifday)

If countryString.Contains("E")
    pred = pred.Or(Function(h) h.E)
EndIf
If countryString.Contains("S")
    pred = pred.Or(Function(h) h.S)
EndIf
...

Return query.Where(pred.Expand())

(Я не свабодна ў VB, так што можа быць нейкая памылка ёсць)

См

гэты адказ для падобнага прыкладу.

0
дададзена
Герт дзякуй за гэта. Я вырашыў пайсці з змяненнем структуры, як гэта нармалізуецца і робіць сістэму маштабуецца. У табліцы ў цяперашні час займае каля 20 няцотных запісаў (колькасці розных банкаўскіх святаў у Вялікабрытаніі на працягу наступных 3-х гадоў), таму яго не вялікая праца.
дададзена аўтар Mych, крыніца

У той час як структура БД не з'яўляецца аптымальнай, калі вы працуеце з успадкаваным кодам і няма ніякіх намаганняў дадзена для поўнага рэарганізаваць, табе прыйдзецца абыйсціся (я адчуваю да цябе).

Самы просты варыянт Я думаю, што ў вас ёсць, каб выбраць не толькі дату, але і атрыбуты.

Dim BHQ = From d in db.Tbl_BankHols _
          Where d.BHDate = chkDate _
          Select d

Гэты код дасьць вам d.S, d.E, d.W і d.I, якія вы можаце выкарыстоўваць праграмна вызначыць, калі свята ставіцца да любой краіне, вы зараз працуеце. Гэта азначае, што па-за запыту, вы будзеце мець асобны, калі заяву, якое будзе кваліфікавацца, калі свята ставіцца да краіны, якую вы апрацоўваеце.

0
дададзена

У той час як структура БД не з'яўляецца аптымальнай, калі вы працуеце з успадкаваным кодам і няма ніякіх намаганняў дадзена для поўнага рэарганізаваць, табе прыйдзецца абыйсціся (я адчуваю да цябе).

Самы просты варыянт Я думаю, што ў вас ёсць, каб выбраць не толькі дату, але і атрыбуты.

Dim BHQ = From d in db.Tbl_BankHols _
          Where d.BHDate = chkDate _
          Select d

Гэты код дасьць вам d.S, d.E, d.W і d.I, якія вы можаце выкарыстоўваць праграмна вызначыць, калі свята ставіцца да любой краіне, вы зараз працуеце. Гэта азначае, што па-за запыту, вы будзеце мець асобны, калі заяву, якое будзе кваліфікавацца, калі свята ставіцца да краіны, якую вы апрацоўваеце.

0
дададзена